{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'quandl'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-3-a25d87fc65db>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# encoding: utf-8\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;31m# import tensorflow as tf\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mquandl\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      4\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mpymongo\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mMongoClient\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'quandl'"
     ]
    }
   ],
   "source": [
    "# encoding: utf-8\n",
    "# import tensorflow as tf\n",
    "import quandl\n",
    "import pandas as pd\n",
    "from pymongo import MongoClient\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "pd.set_option('display.width', None)  # 设置字符显示宽度\n",
    "pd.set_option('display.max_rows', None)  # 设置显示最大行\n",
    "pd.set_option('display.max_columns', None)  # 设置显示最大列\n",
    "\n",
    "quandl.ApiConfig.api_key = '-GGCYDJNb2cxMLTvqTho'\n",
    "d = pd.read_excel(r'E:\\code.xlsx', input_col=0,dtype={'code':str})\n",
    "code = d[['品种简称', 'code']]\n",
    "data2 = pd.DataFrame()\n",
    "for temp in d['code']:\n",
    "    try:\n",
    "        data = quandl.get('CFTC/' + temp + '_F_L_ALL', paginate=True)\n",
    "        data['code'] = temp\n",
    "        # 净持仓\n",
    "        data['大户净持仓'] = data.apply(lambda x: x['Noncommercial Long'] - x['Noncommercial Short'], axis=1)\n",
    "        data['套保净持仓'] = data.apply(lambda x: x['Commercial Long'] - x['Commercial Short'], axis=1)\n",
    "        data['散户净持仓'] = data.apply(lambda x: x['Nonreportable Positions Long'] - x['Nonreportable Positions Short'],axis=1)\n",
    "        # 最大值最小值\n",
    "        chg = data[['大户净持仓', '套保净持仓', '散户净持仓']]\n",
    "        max = chg.rolling(window=156).max().dropna()\n",
    "        min = chg.rolling(window=156).min().dropna()\n",
    "\n",
    "        hb = pd.merge(max, min, on=['Date'], how='outer')\n",
    "        hb1 = pd.merge(data, hb, on=['Date'], how='outer')\n",
    "        # cot指标\n",
    "        data['大户cot(%)'] = round(hb1.apply(lambda x: ((x['大户净持仓'] - x['大户净持仓_y']) / (x['大户净持仓_x'] - x['大户净持仓_y'])) * 100, axis=1), 2)\n",
    "        data['套保cot(%)'] = round(hb1.apply(lambda x: ((x['套保净持仓'] - x['套保净持仓_y']) / (x['套保净持仓_x'] - x['套保净持仓_y'])) * 100, axis=1), 2)\n",
    "        data['散户cot(%)'] = round(hb1.apply(lambda x: ((x['散户净持仓'] - x['散户净持仓_y']) / (x['散户净持仓_x'] - x['散户净持仓_y'])) * 100, axis=1), 2)\n",
    "\n",
    "        data = data[['code', '大户净持仓', '套保净持仓', '散户净持仓', '大户cot(%)', '套保cot(%)', '散户cot(%)']]\n",
    "        data = data.reset_index()\n",
    "        data = pd.merge(data, code)\n",
    "#         data = data[data['套保cot(%)']>=100 or data['套保cot(%)']<=0]\n",
    "        data = data.tail(10)\n",
    "        data2 = data2.append(data)\n",
    "        \n",
    "    except:\n",
    "        print('? ?')\n",
    "    continue\n",
    "\n",
    "# data2=data2[data2['套保cot(%)']>=100 or data2['套保cot(%)']<=0]\n",
    "data2\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CFTC一览"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABGoAAAHoCAYAAAAR9wlyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeXxPZ/7//+clCwkilmpURJRWCTGWEEOntPaE2sZgOkOntUx1+bUY2ipttYYp1ZaGtowoTbXVqGgtbTW06HyDSqwt9ZFU7OSNLITI+f2ReFeQTbaDx/12e9845zrX61zXO73N8HSd6xjLsgQAAAAAAICyV66sBwAAAAAAAIAsBDUAAAAAAAA2QVADAAAAAABgEwQ1AAAAAAAANkFQAwAAAAAAYBMENQAAIF/GmBeNMV8Xof/dxpi7rzgeZ4w5UjyjAwAAuHUQ1AAAYHPGmCeNMb8ZY1KNMRHGmCrZ5zsYY6xcPh2MMUPzaPfPr/5VLmR/Lvf5Npe6q3OZxjhJG40x5bOP07M/Rf1u7jTGLMse+zljzMfGmIpXtBtjzCvGmKPZc3z0qv6VjDELjDFnjDEXjDFrjDE1r7rmiey+x4wxz9/gOAOMMam5tBWpfkH7G2M+MsZsKmx9AABQulzLegAAACB32cHCm5JGS9onaYakuZIGXXFZL0lXr075RdIOSUHZx1GSvpT0fvbx4ULUl6RL2Z/Lzkt6QdKcK849L8n/OnOoImmwpGmWZeUazhhjyklytyzrfG7XXMdSSbUljZdUVdJLko5Leia7fXz25zlJSZLeN8bEW5YVnd0+R1JXSa9LypD0sqQPJD2cPaZBkmZnn4+V9J4x5ohlWeEFHWB28PO5JM/rtBWpfkH7G2MeUNbPNLig4wYAAGWDoAYAAJvKDi5ekzTbsqxZ2ecuSVptjPnXFZfusCwrPpcyp7L7XZB02LKsLYWof0hSQ2WtfPGW5GGMuVfSRWWFNucsyzp9RT03SWevM4bJkipJmmyMmXzVHK2rrl0oaWguc8nBGPOQpCaSGluWdST7nI+kPpKeyV6987ykVy3Leje7vX72uWhjTANJf5HUwrKsndntrpJeN8aUzw6VXpE037KsV7PbvSRNlBRewDHWlhQt6UwulxSpfkH6Z89ptqSPLMuKKWBdAABQRnj0CQAA+2op6S5JkVec26Ks//9uVAr1vSRtlxQnaaykjpJ+kjRPkjNgMca0MsYMlNRd0s9X3iA7DHlC0tOWZZnLH0nPSkq46lw5SY8XYvxbJLW9HNJkOyXJLfv3rSRVlvTJFe1fSvpTdnhxWFLLyyHNFf1dJJXLDlnuuU7/e4wxdQo4xhaSIiT96+qGotYvRP+nJd2trIAKAADYHEENAAD21ST7118un7Asy6GsQGRHSde3LOu0ZVlulmVVVtZf8r+yLKuSZVkPXVXHV9IDkt7O/khyruQ4qazHbeYZYypc/ihrVa+56lx5Sa7GmMrGGJPf4C3LOmNZ1s9Xne4s6X/Zv79LWY9o7b+i/WD2fXwty0qzLOvq77GzpDjLss5l95ckZ5CTvYIoRVJ9Y0w5Y4xrLp/Lf8b6yrKsl3VFsHWFotbPs7/kfOzqZUnxkqYYY94yxtS7zlgAAIBN8OgTAAD2dXlTW8eVJy3LWi1JxpiGJVn/eowxbZS1OkOSZhpjZl51yRxjTAPLsvYra7XHMmU9OnW9oMKh30OVK5WX1FpScr4zyDm2LpLaSHow+1QFSWcsy7ry3ueyf62urPDiyv6NJPWXNOyK/pJ0Wjmdy+4/UdKkXIazUNJQy7Iy8xhyUevPz6e/lLWPUGVlPbpWU1l77wwxxrSzLGt3HmMDAABlhKAGAAD7cs/+Na+/7EvSgSsXoGQ/RlTk+tkrYgIk3a+szYBbKWvPmreyL/mXsh6rGSppq6QnJf09O6SRZVl7JN1XwLEUiTHGQ9K7klZdsVFwunJugCz9/uYqj6v6G2VttLxL0qIr+iuXGh7K2nT5i1yGlFSAYRe1vk9e/bN/fo8q6/G1NpZlnc9eYfOTskKggQUYIwAAKGUENQAA2FdK9q8Vlb26xBjjImm9sjaRvZjdHqLstzgVc31J+lrSZmVtEvylZVm9sq/rnn3/TyX9xbKstcaYB5W1H0sOxhhfZT1yVBAehXzr02X/kVRDWfvoXHZcUk1jjItlWZfDjKrZv6Zd1f85Za3GaWNZVsYV/aWsR4wSrrjWW1KaZVlHJR29gbFeOb4brn/F41XX7a+sFTRekuZc/k4tyzpujFkhqUMRxg0AAEoQe9QAAGBfl/dWuXJPkaqS2innP7bstiwr9vKnuOpblvWNpHssy2qtrE1qr7fy5l1JfzXGPCbpj8raaPhql4OXntn1r/d5JPuaC9f0zocxpo+yVvMMsywr8Yqmbcp65CroinPNs391bkCc/TjXvyU9b1nWtiuu/U3SMUltr7j2XmUFWzcSjF2tqPXz6385iDtwVb/zuoHvGQAAlA6CGgAA7Ot7Zf2FOvSKc+2VFT7ElUZ9y7J+zauAZVn/J+kDZQU0c64KSi67HPCkZG9QfM1HUmp2vfwe88rBGPMHSR8q6xXjS68a2xlJ6ySNvuL0P5UVbF1+nXcdZe2js1rSm1f1z5QUpaxXfV8Oxp5Q1qu2txZmnNdT1Pr59bcs66ykvZKaXdW1vbJWSQEAABvi0ScAAGzKsqzTxpjpkiYZY85KSpQ0S1KkZVmHs1dPlFj9fLqXu+r3FyV1McbcnR3e5LhVQcd01WNK+V3rpqxXUzskfWyMaXVF83bLsi4o6xGuaGPMt5KMsjYaHnTFdR8qawXKO5JaXrHXzy+WZSUr65GqrZI2GmOOKGsz3ucty7qo4lHU+vn1ny5phjEmWVmvTv+bpEBJjxXT+AEAQDEjqAEAwN4mKOtRlReV9faeSEmjSqu+Maa8sjatDdLvj9JIWRsRlzfGvCPpL5L+oKzHh7YYYyZKmnvFXi+XQ53oArx1203Xbo6bm6aSLodVG69qqycp3rKsjcaY+5UV2HhJGmhZ1ifZc6um3/dq+eaq/h0lrbMs61djTGtJU5X1GvKnlPW4V7Eoav38+luW9YExxpL0/ynrld3xkvpblrW9uOYAAACKl8n5xkoAAIDfGWNqS/pVWXuePGZZ1rrs82uVtQLnD5L6ZQcG5SQ9L2m4pI6XV9Zk10hU1h41G3K5VYikxZK8sleyAAAA3JYIagAAQJ6MMZUsy0rJpe2aR5WMMa5XrKYp6D3cJFXM3q8GAADgtkVQAwAAAAAAYBO89QkAAAAAAMAmCGoAAAAAAABsgqAGAAAAAADAJvJ7PTcb2AAAAAAAABQvk1sDK2oAAAAAAABsgqAGAAAAAADAJghqAAAAAAAAbIKgBgAAAAAAwCYIagAAAAAAAGyCoAYAAAAAAMAm8ns9NwAAAAAAKAGZmZlKTExUampqWQ8FxcjNzU01a9aUl5fXDfUnqAEAAAAAoAycPHlSxhg1bNhQ5crxwMutwLIsnTt3TocOHZKkGwpr+C+hEBYsWCA/Pz95enqqbdu22rVrlyTpgw8+UEBAgKpWraq//vWvOnnyZIHq7dy5U0FBQapatarGjh0ry7Kcbe+//75q1aolNzc3derUyflDBgAAAADcGk6fPq0777yTkOYWYoyRp6enateurePHj99QDf5rKKD9+/dr0qRJWrZsmfbu3atWrVpp0KBBioqK0r/+9S/Nnj1bsbGxOn36tPr06ZNvvfT0dPXs2VPBwcHasmWLduzYofDwcEnShg0bNGHCBIWHhyshIUHlypXTc889V8IzBAAAAACUpkuXLsnNza2sh4ES4OHhoYsXL95QX4KaAtq2bZuCg4PVsmVL+fr6asSIEfr1118VHh6ukSNHqmPHjqpbt67eeOMNbdiwQadOncqz3qpVq5Samqrp06erfv36mjp1qubPny9J2rdvn9577z117dpVd911lx5//HFt2bKlNKYJAAAAAChFxpiyHgJKQFF+rgQ1BdS4cWNFR0crNjZWycnJevvtt9W5c2edPHlSfn5+zutcXFwkSa6ueW//ExcXp/bt26t8+fKSpGbNmmn37t2SpEcffTTHqpzdu3erQYMGxT0lAAAAAACKxX/+8x/n9iB5+eyzz7Rv375SGFHBrVy5Utu2bcvzmjVr1pTaAgqCmgJq3Lix+vXrp+bNm8vLy0tffvmlZs+erRYtWuiLL75w7i8zf/58tW7dWlWqVMmz3tmzZ1WvXj3nsTFGLi4ucjgc11wXFhamkSNHFv+kAAAAAAAoov/7v//Tq6++Kk9Pz3yvHTt2rPbu3as1a9bIw8ND/v7+zo+vr69q165dCiP+3c8//6znnntONWvWvG77wYMHJUm1atXSI488csP7zhQGb30qoJiYGEVFRWnTpk0KCAjQzJkz1bVrV0VHR6tnz55q1aqVXF1dFRMTo0WLFuVbz9XV1bn65rIKFSooLS1NVatWdZ575pln1KxZswLtewMAAAAAuLk9sv5Aqd5v8QP18r/oKo0aNVJSUpI8PDwkSUlJSTLGqGPHjjp37pzc3d3l4uKi8+fPq06dOtq8ebMkaf369fL29lZISIiio6PVrl07ffvtt8668fHxeuihh4pnYgX0z3/+U3PmzFHt2rUVFxenHj16KDQ0VO+9955SU1MVERGhcePGKTAwUOPHj9f48eP13//+t0THxIqaAvr44481aNAgtW3bVl5eXpo0aZIcDof27NmjmJgYLVmyRE2bNlVAQIAGDx6cb71q1arpxIkTOc4lJyfL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cjgcCgsLu+Y+x48f15133uk87tu3r4YOHSo/Pz/FxMSoc+fO1/SpWbOmjh8/fkPzKigefQIAAAAAAAWWkZGhChUqOF9XPXXqVB08eFDvvvuu5s2bp//3//6ffHx8rtnH5fTp01q/fr1cXXOPIjIzMzV8+HBJ0ldffaWKFSvq5ZdfliS98MILatasmS5evKgVK1bI09NTEydOlDFG77zzjmrUqKGYmBgFBwfLw8NDrq6u8vT0lLe393XvVbFiRaWkpKhatWqSpD/96U86evSoUlJStGzZMj399NPasGGDVq5cqVq1aknKCogqVapUlK8vX6yoAQAAAAAABebu7q7t27fL19dXvr6++ve//+18rOnBBx/U8uXLtXr1arVr1y5Hv+PHj6tLly7KyMjI9fPJJ5+obdu2krJejV2vXj1n/8qVK2vgwIFyc3Nztl1efePh4aFatWrpt99+K/A8/Pz8tH///hznKleurIiICIWGhmr16tXq1KmTIiMjne379++Xn59f4b6wQiKoAQAAAAAAhRIYGKjExEQlJibq+eefd56/++67VbduXW3cuFF9+vTJ0efHH39Us2bN8qz75z//WUOGDJEk1alTRwkJCc62jIwMNWvWTPv27ZOfn58OHDjgbDt37pyOHDmSY/PfcuXKybKsXO/VrVs3RUVF5TiXkZGhlJQUGWN01113qVGjRkpKSnK2r1ixQj169MhzDkVFUAMAAAAAAApl165datKkiZo0aaK33nrLef7cuXM6ceKEJCk2NtZ5/tSpU/rqq68UEhJS4HuEhoYqOTlZkydP1qFDhzRlyhSdOXNGdevWVWhoqNLS0vTKK68oISFBTz/9tO677z4FBQU5+zdo0EBr167VkSNH9N133yk9PT1H/QEDBmjJkiU6deqU89zy5cvVq1cveXl56dixY0pISHA+OrV3717FxcWpQ4cOhfquCougBgAAAAAAFNjFixcVEBCgnTt3auvWrfrLX/4iY4ySk5PVv39/tWrVSh9//LEefvhhvfPOO7p06ZJeeOEFNW7cWA888ECB71O5cmWtXr1aq1evVsOGDfX1118rKipK7u7uqlSpktasWaOvv/5aTZs2VWJiopYvX65y5X6POV566SXFx8erXr16GjZsmDIyMnLUr1atmsaOHasRI0Y4V97Ex8erefPmqlKlioKCgvThhx+qV69e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ANxitm3bJmOMmjRpIk9PT3Xv3l2//fabJGnu3LnasWOH/P39FRUVpfT09ALXHT16tPr06aPg4ODrtl+6dElTpkzhsScAAIAiIKgBAOAWs3v3bjVu3FgRERGKi4uTi4uLhg0bppSUFE2aNEl33323EhISNHPmTP3xj39UampqvjWjo6O1du1aTZs2Lddrli9frpo1a6pNmzbFOR0AAIDbCo8+AQBwi3nsscf02GOPOY/DwsLk7++vyMhIpaamKjo6WjVq1FBGRoaaNm2qhQsX6oknnsi13vnz5zVixAjNmTNHXl5euV4XFhamUaNGFetcAAAAbjesqAEA4Bbn5eUly7J08OBBBQUFqUaNGpIkV1dXBQYG6sCBA3n2nzx5soKCghQSEpLrNYcPH9amTZvUp0+fYh07AADA7YagBgCAW8yoUaP0xRdfOI83b94sY4x8fX2VlpaW49qEhATVq1cvz3oRERFavny5vL295e3trYiICD3xxBMKDQ11XvPpp5/qwQcfzHPFDQAAAPLHo08AANximjVrpnHjxqlKlSq6cOGCnnrqKf39739XaGionn76aYWFhalXr16KjIxUbGyslixZIkk6e/asPDw85ObmlqPeDz/8oIyMDOfxmDFjFBwcrEceecR5btWqVerWrVvpTBAAAOAWRlADAMAtZtiwYfrll1/Up08fValSRX379tVrr72mihUrauXKlRozZozGjBkjHx8fLVmyRP7+/pKkwMBATZ8+Xf37989Rz9fXN8dxpUqVVKNGDfn4+EiSLl68qA0bNui1114rlfkBAADcyghqAAC4xRhjNGPGDM2YMeOatnbt2unHH3+8br/4+PgC1Q8PD89x7ObmVqA3RwEAACB/7FEDAAAAAABgE6yoAQDABh5Zn/ebl0rb4gfy3mAYAAAAJYMVNQAAAAAAADZBUAMAAAAAAGATBDUAAAAAAAA2QVADAAAAAABgEwQ1AAAAAAAANkFQAwAAAAAAYBMENQAAAAAAADZBUAMAAAAAAGATBDUAAAAAAAA2QVADAAAAAABgEwQ1AAAAAAAANkFQAwAAAAAAYBMENQAAAAAAADZBUAMAAAAAAGATBDUAAAAAAAA2QVADAAAAAABgEwQ1AAAAAAAANkFQAwAAAAAAYBMENQAAAAAAADZBUAMAAAAAAGATBDUAAAAAAAA2QVADAAAAAABg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vkdXZebkupcXuro1jW7TWg1qhKpGYKBm7TugkS2jtf3sWa05+a3evb13BZYIV87g9cknnygtLU0zZ85UaGiopk+frv/5n//RT3/602Lzyc7O1vz58xURESFJ6tq1q95//333+rS0ND3++OOaPn266tWrd/UKBACokgjUAAAAeKFZs2b5lmvXrq2GDRu6f5wXJTY2VrGxsZowYUK+9EY18g8KXDc4WJIUUaumJOmt3j31v7v26N3VaxUWHKTnu9yoWxrUL28x4CFvBq+LFy9Kknbt2qU+ffq4g2pdunTR/v37S8wnJiZGMTExkpzA3Jw5czR06FD3+hdeeEGXLl1SUFCQVq9erf79+ysggIbuAAAHgRoAAIAKUFiXmMTExAJp69evL1V+cR3b51tuVbeO3ul7mxdHhtIobAav5OTkfDN4GWMUGBioc+fOKTw8vMQ8V6xYoYceu/w+OwAAIABJREFUekhRUVGaMmWKJCkpKUl/+MMf1K1bN3311VeaNWuWmjRpohUrVhCsAQBIYowaAAAAXOOKmsErKCioQBe1GjVqKD29dIM433vvvVqxYoUk6de//rUkaeHChbr++uu1du1aTZkyRZ9++qk2b96sf/zjHxVUGgBAVUeLGgAAcM14+NNjlX0IBUyq7ANAkTN41a9fX19++WW+tJSUFIWEhJQq36CgIPXr109z587VoEGDNHPmTB0/flx33nmnari6utWpU0dt2rTRsWP+VzfhG+fPn9fhw4fVpk2bUrXUAlD90aIGAAAA17SiZvB64YUXtHnzZvd2x44dU2ZmpurXL35soIULF2rOnDnu5ZCQEHe3pmbNmuVrkZObm6vjx4/n62KFa8eSJUsUFRWl0aNHq2nTpu5Bp9955x1FRkaqVq1a6tWrl/bt21emfH/1q19p8ODBRa73nIIegP8hUAMAAIBr2oYNG7R3717t3LlTO3fu1JAhQ/S73/1Ohw8f1qlTp7R48WJJ0tSpU9W/f38FBgZKclpC5OTkFMivXbt2mjhxopYvX67ExERNnjxZP/7xjyVJDz74oD7++GN98MEHOn78uH79618rMzNTffv29V2B4RfOnj2ruLg4bdq0SXv27NHrr7+uCRMm6OjRo5o8ebI+/PBDHT58WN26ddPIkSNLne/u3bs1d+5czZo1q9D1nlPQA/BPdH0CAADANa2oGbyaNWum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kpI0fPhwzZkzRzfe6MzStGrVKk2cONG9TUhIiIwxMsYUm1dEzRq6mJOTL+1k+kU1C6tV8QcOAAAAAICfI1CDMrl48aIGDRqk2NhYPfDAA0pNTVVqaqrat2+v2bNn65133tE333yj5557TgMGDFD9+vUlScnJycrKyiqQ3x0REUpMSdWfjx7Td+kX9e6XR3Xg/AXdEXG9r4sGAAAAAEClI1CDMlm9erX27dun+fPnq06dOu4/a62WLl2qV155RZ06dVJqaqoWLVrk3i8mJkYJCQkF8gsPDdGbvXtq+dff6J7Va7XwyFd6tUc3WtQAAAAAQBHS09O1detWfffdd5V9KLgKGKMGZXLffffJWlvouqioKA0cOLDQdYmJiUXm2bVhAy298/ZiX/ef995d6mMEAAAAAF9KSEjQ008/ra+//lq33HKL/vSnP6lz586SpIyMDPXt21czZsxQv379ypz32LFj1aRJE02ZMkWStH79eg0bNkw33HCDjhw5omnTpumpp56qwNKgstGiBgAAAAAALx09elSjRo3S1KlTdfLkSXXo0EGjR4+W5LR8GT58uLZt2+ZV3hs3btRbb73lXs7Oztajjz6qpUuXavfu3Vq5cqWee+45ZWRkVEhZ4B9oUXMNePjTY5V9CPlMquwDAAAAAIAKcuDAAU2fPl0jRoyQJI0fP169evVy/79Dhw7atWtXmfO9dOmSxowZo/bt27vTLly4oIkTJ+quu+6SJHXt2lWZmZlKTk5WjRo1KqA08AcEagAAAAAA8FJsbGy+5f3796t169aSpEmTJik6OlpLly4tc77Tpk1TixYtdOutt7rTGjRooDFjxkiSrLWaPn26brvtNjVu3LgcJYC/IVADAAAAAEAFyM7O1owZMzRu3DhJUnR0tFf5HDx4UK+99pq2b9+uP/3pTwXWf/fdd7r55pt14cIF7dmzp1zHDP/DGDUAAAAAAFSAl156SZL0+OOPe52HtVZjx47VlClTFBkZWeg2ERERWrt2re69916NHDmyyAlfUDXRogYAAAAAgHLasGGD4uPj9dlnnyk0NNTrfObPn6/c3NwSgz0dO3bU4sWLFR4erh07duiWW27x+jXhXwjUAAAAAABQDklJSRo+fLjmzJmjG2+8sVx5LV68WNu3b1d4eLgkuWd0WrZsmd5991299tprmj9/viQpKChIgYGBCgig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\n",
      "text/plain": [
       "<Figure size 1440x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "#二行即可搞定画图中文乱码\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "\n",
    "dates=data2['Date'].dt.strftime(\"%Y-%m-%d\")\n",
    "dates=dates.drop_duplicates().reset_index(drop=True)\n",
    "dates=dates.iloc[-1]\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "df=data2[data2['Date']>=dates]\n",
    "# Sort the dataframe in descending order of Very interested. 降序排列\n",
    "df=df.sort_values(by=['散户cot(%)'],ascending=False)\n",
    "\n",
    "fig = plt.figure()\n",
    "#use a figure size of (20, 8),bar width of 0.8, 设置图片大小，柱宽\n",
    "#use color #5cb85c for the Very interested bars, 设置柱子颜色\n",
    "#color #5bc0de for the Somewhat interested bars,\n",
    "#color #d9534f for the Not interested bars,\n",
    "c=df.plot(kind='bar', y=['套保cot(%)','散户cot(%)'],figsize=(20, 8),width=0.8,\n",
    "           color=['#5bc0de','#d9534f'],fontsize=14)\n",
    "\n",
    "codes=range(len(df.index))\n",
    "#use font size 14 for the bar labels, percentages, and legend, 图例颜色\n",
    "plt.xticks(codes,df['品种简称'])#x轴标更改\n",
    "plt.legend(fontsize=14)\n",
    "plt.xticks(rotation=360)#旋转角度\n",
    "\n",
    "# plt.yticks([]) # y轴空轴\n",
    "#use font size 16 for the title, and, 标题字号\n",
    "plt.title(\"CFTC报告 \"+dates,fontsize=16)\n",
    "\n",
    "plt.yticks([]) # y轴空轴\n",
    "#display the percentages above the bars as shown above 数据标签列表\n",
    "x=np.arange(len(df.index))\n",
    "# yv=np.array(list(df['大户cot(%)']))\n",
    "ys=np.array(list(df['套保cot(%)']))\n",
    "yn=np.array(list(df['散户cot(%)']))\n",
    "# for a,b in zip(x,yv): ##控制标签位置\n",
    "#     plt.text(a-0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "for a,b in zip(x,ys):\n",
    "    plt.text(a,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "for a,b in zip(x,yn):\n",
    "    plt.text(a+0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "#remove the left, top, and right borders. 去掉图片边框\n",
    "c.spines['top'].set_visible(False)\n",
    "c.spines['right'].set_visible(False)\n",
    "#c.spines['bottom'].set_visible(False) 保留横坐标边框\n",
    "c.spines['left'].set_visible(False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 高质量见顶信号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CFTC没有出现见顶信号\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "#二行即可搞定画图中文乱码\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "\n",
    "dates=data2['Date'].dt.strftime(\"%Y-%m-%d\")\n",
    "dates=dates.drop_duplicates().reset_index(drop=True)\n",
    "dates=dates.iloc[-1]\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "df=data2[data2['Date']>=dates]\n",
    "df=df[df['散户cot(%)']>=100]\n",
    "df=df[df['套保cot(%)']<=5]\n",
    "if df.shape[0]==0 :\n",
    "    print(' ')\n",
    "if df.shape[0]>0 :\n",
    "    # Sort the dataframe in descending order of Very interested. 降序排列\n",
    "    df=df.sort_values(by=['散户cot(%)'],ascending=False)\n",
    "\n",
    "    fig = plt.figure()\n",
    "    #use a figure size of (20, 8),bar width of 0.8, 设置图片大小，柱宽\n",
    "    #use color #5cb85c for the Very interested bars, 设置柱子颜色\n",
    "    #color #5bc0de for the Somewhat interested bars,\n",
    "    #color #d9534f for the Not interested bars,\n",
    "    c=df.plot(kind='bar', y=['套保cot(%)','散户cot(%)'],figsize=(20, 8),width=0.8,\n",
    "               color=['#5bc0de','#d9534f'],fontsize=14)\n",
    "\n",
    "    codes=range(len(df.index))\n",
    "    #use font size 14 for the bar labels, percentages, and legend, 图例颜色\n",
    "    plt.xticks(codes,df['品种简称'])#x轴标更改\n",
    "    plt.legend(fontsize=14)\n",
    "    plt.xticks(rotation=360)#旋转角度\n",
    "\n",
    "    # plt.yticks([]) # y轴空轴\n",
    "    #use font size 16 for the title, and, 标题字号\n",
    "    plt.title(\"CFTC报告 见顶信号 \"+dates,fontsize=16)\n",
    "\n",
    "    plt.yticks([]) # y轴空轴\n",
    "    #display the percentages above the bars as shown above 数据标签列表\n",
    "    x=np.arange(len(df.index))\n",
    "    # yv=np.array(list(df['大户cot(%)']))\n",
    "    ys=np.array(list(df['套保cot(%)']))\n",
    "    yn=np.array(list(df['散户cot(%)']))\n",
    "    # for a,b in zip(x,yv): ##控制标签位置\n",
    "    #     plt.text(a-0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "    for a,b in zip(x,ys):\n",
    "        plt.text(a,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "    for a,b in zip(x,yn):\n",
    "        plt.text(a+0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "    #remove the left, top, and right borders. 去掉图片边框\n",
    "    c.spines['top'].set_visible(False)\n",
    "    c.spines['right'].set_visible(False)\n",
    "    #c.spines['bottom'].set_visible(False) 保留横坐标边框\n",
    "    c.spines['left'].set_visible(False)\n",
    "    plt.show()\n",
    "    \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 高质量见底信号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CFTC报告没有出现见底信号\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "#二行即可搞定画图中文乱码\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "\n",
    "dates=data2['Date'].dt.strftime(\"%Y-%m-%d\")\n",
    "dates=dates.drop_duplicates().reset_index(drop=True)\n",
    "dates=dates.iloc[-1]\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "df=data2[data2['Date']>=dates]\n",
    "df=df[df['散户cot(%)']<=0]\n",
    "df=df[df['套保cot(%)']>=95]\n",
    "if df.shape[0]==0 :\n",
    "    print(' ')\n",
    "if df.shape[0]>0 :\n",
    "    # Sort the dataframe in descending order of Very interested. 降序排列\n",
    "    df=df.sort_values(by=['散户cot(%)'],ascending=False)\n",
    "\n",
    "    fig = plt.figure()\n",
    "    #use a figure size of (20, 8),bar width of 0.8, 设置图片大小，柱宽\n",
    "    #use color #5cb85c for the Very interested bars, 设置柱子颜色\n",
    "    #color #5bc0de for the Somewhat interested bars,\n",
    "    #color #d9534f for the Not interested bars,\n",
    "    c=df.plot(kind='bar', y=['套保cot(%)','散户cot(%)'],figsize=(20, 8),width=0.8,\n",
    "               color=['#5bc0de','#d9534f'],fontsize=14)\n",
    "\n",
    "    codes=range(len(df.index))\n",
    "    #use font size 14 for the bar labels, percentages, and legend, 图例颜色\n",
    "    plt.xticks(codes,df['品种简称'])#x轴标更改\n",
    "    plt.legend(fontsize=14)\n",
    "    plt.xticks(rotation=360)#旋转角度\n",
    "\n",
    "    # plt.yticks([]) # y轴空轴\n",
    "    #use font size 16 for the title, and, 标题字号\n",
    "    plt.title(\"CFTC报告 见底信号 \"+dates,fontsize=16)\n",
    "\n",
    "    plt.yticks([]) # y轴空轴\n",
    "    #display the percentages above the bars as shown above 数据标签列表\n",
    "    x=np.arange(len(df.index))\n",
    "    # yv=np.array(list(df['大户cot(%)']))\n",
    "    ys=np.array(list(df['套保cot(%)']))\n",
    "    yn=np.array(list(df['散户cot(%)']))\n",
    "    # for a,b in zip(x,yv): ##控制标签位置\n",
    "    #     plt.text(a-0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "    for a,b in zip(x,ys):\n",
    "        plt.text(a,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "    for a,b in zip(x,yn):\n",
    "        plt.text(a+0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)\n",
    "    #remove the left, top, and right borders. 去掉图片边框\n",
    "    c.spines['top'].set_visible(False)\n",
    "    c.spines['right'].set_visible(False)\n",
    "    #c.spines['bottom'].set_visible(False) 保留横坐标边框\n",
    "    c.spines['left'].set_visible(False)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-4-8aaef3400df4>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美原油'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "plt.xlabel('日期')\n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=15)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-5-09e4b469aef3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美豆'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "\n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-6-e0d5282a5331>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美豆油'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "\n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-7-b06a19321ec6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美豆粕'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-8-b8e70e49ca65>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美铜'\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-9-5fad4d8dcd15>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美黄金'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-10-621bf23526d6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美白银'\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-11-14cbeda31f53>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美棉'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "\n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-12-5166f46e8ed5>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美糖'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "\n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-13-c226c13c4a17>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美元指数'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "\n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='美玉米'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=15)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data2' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-14-9368eef54014>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata2\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Date'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'大户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'套保cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'散户cot(%)'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'品种简称'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'data2' is not defined"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1152x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdate\n",
    "from scipy.interpolate import make_interp_spline\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "\n",
    "symbol='天然气'\n",
    "\n",
    "fig = plt.figure(figsize=(16,8))#\n",
    "df=data2[data2['品种简称']==symbol]\n",
    "df=df[['Date','大户cot(%)','套保cot(%)','散户cot(%)','品种简称']]\n",
    "\n",
    "x=df['Date']\n",
    "y1=df['大户cot(%)']\n",
    "y2=df['套保cot(%)']\n",
    "y3=df['散户cot(%)']\n",
    "\n",
    "\n",
    "# w=41,k=2的平滑效果最明显。即window_length越大，polyorder越小，则平滑效果越强\n",
    "# w=21,k=4最接近原曲线。即window_length越小，polyorder越大，则结果越接近原始曲线。\n",
    "# y11=scipy.signal.savgol_filter(x,53,3)\n",
    "# y22=scipy.signal.savgol_filter(x,53,3)\n",
    "\n",
    "# plt.semilogx(f,tmp*0.5,label = 'mic'+str(num+1))\n",
    "# plt.semilogx(f,y11*0.5,label = 'mic'+str(num+1)+'拟合曲线-21',color = 'red')\n",
    "# plt.semilogx(f,tmp_smooth2*0.5,label = 'mic'+str(num+1)+'拟合曲线-53',color = 'green')\n",
    "\n",
    "# plt.plot(x,y11)\n",
    "\n",
    "plt.plot(x,y2,color='#5bc0de',label='套保')\n",
    "plt.plot(x,y3,color='red',label='散户')\n",
    "\n",
    "for a,b in zip(x, y2):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)   \n",
    "for a,b in zip(x, y3):\n",
    "    plt.text(a, b+0.3, str(b), ha='center', va='bottom', fontsize=10.5)\n",
    "    \n",
    "\n",
    "    \n",
    "plt.ylabel('cot(%)')\n",
    "plt.title(symbol+' '+dates,fontsize=16)\n",
    "\n",
    "plt.legend(fontsize=12)\n",
    "\n",
    "plt.xticks(rotation=15)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
